package com.tedu.api.io;

import org.junit.Test;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * RandomAccessFile
 * 专门解决File无法实现读写的操作类【数据传输】，底层使用C完成
 * 【使用方法并不方便】----知道
 * RandomAccessFile构造器使用("文件路径"，"r代表读，rw代表读写")
 * RandomAccessFile方法的使用：读写操作
 * 需求：实现音乐C V  复制 粘贴
 *
 */
public class RandomAccessFileAPI {


    @Test
    public void testWrite() throws IOException {

        //创建RAF类: 在API 项目文件夹下 直接创建raf.txt文件，模式：读写
        RandomAccessFile raf =
                new RandomAccessFile("raf.txt", "rw");
/**
 * write()
 * 作用：写出一个字节，将给定的int值对应2进制的”低8位“写出
 * 该方法有异常，范围0~255之间--写入ASCII码【接近底层】
 * 出现异常：抛出IO异常----有可能存在文件无法写出的情况
 */
        raf.write(97);
        raf.write(98);
        raf.write(224);
        raf.close();//关闭
    }

    public void testRead() throws IOException {

        //创建RAF类: 模式：r
        RandomAccessFile raf =
                new RandomAccessFile("raf.txt", "r");
        /**
         * read()
         * 作用：读取一个字节，返回十进制值【int】
         * 如果返回值-1，代表读取末尾
         * 抛出IO异常
         */
        int a = raf.read();
        int b = raf.read();
        int e = raf.read();
        int c = raf.read();
        System.out.println("读取到：" + a + "" + b + "" + e + "" + c);
    }

    //需求：实现音乐C V  复制 粘贴
    @Test
    public void testCopy() throws IOException {
//1.被复制的文件--复制操作---模式:r
        RandomAccessFile src =
                new RandomAccessFile("复制文件.mp4", "r");
//1.复制出来的新文件--粘贴操作---模式:rw
        RandomAccessFile desc =
                new RandomAccessFile("复制品.mp4", "rw");
//2.创建变量类型：int类型--①用于保存读取/写出的每个字节
        int temp=-1;//读取：②读到-1代表文件数据读完了
//5.【一个一个字节的读---一个字节一个字节些】测运行效率
        long start=System.currentTimeMillis();//获取系统时间：毫秒数
//3.从小跳蛙.mp3--读到每个字节--写出新跳蛙
//思考：一直从小跳蛙.mp3读到所有字节

        while ((temp=src.read())!=-1){//如果有数据 true
            //从小跳蛙.mp3读到所有字节,只要不是末尾！=-1 一直读
//4.写出【新跳蛙.mp3】每个字节
            desc.write(temp);//读入temp数据写出write中
        }
        long end =System.currentTimeMillis();//获取系统时间：毫秒数
    //6.关闭流
    src.close();desc.close();
    //7.读取花费时间：
        System.out.println("读取花费时间："+(end-start)/1000+"秒数");
}
    //需求：实现视频C V  复制 粘贴
    /**
     * 读写按照一个字节操作---效率低
     * 
     * 1024 程序员节
     * 一字节=8位二进制
     * 0     0000 0000
     * 1     0000 0001
     * 2     0000 0010
     * 6     0000 0110
     * 1024字节=1KB
     * 1024KB=1MB
     * 1024MB=1G
     * 1024G=1T
     * 读写按照100KB 操作---效率提高
     */
    @Test
    public void testRE() throws IOException {
        //1.被复制的文件---视频---占用内存空间大
        RandomAccessFile src=new RandomAccessFile("视频.mp4","r");
        //1.复制的文件---视频.MP4
        RandomAccessFile desc=new RandomAccessFile("视频1.mp4","rw");
    //2.保存每次读取的字节量
        int len=-1;
        /**
         * 重载
         * read() 一个字节一个字节读
         * read(字节数组) 实现根据自己指定的100KB 方式读取字节
         * 
         */
        //3.定义字节数组--100KB
        byte[] data=new byte[1024*100];
        //4.开始一直从“复制文件.MP4”读取
        //(len=src.read(data))!=-1 判断条件
        while ((len=src.read(data))!=-1 ){
            /**重载
             * write(int i) 写出一个字节
             * write(字节数组，读取开始：0；读取结束：-1)
             * 作用：写出"字节数组：指定大小 100KB“的文件
             * 从0开始，写出到-1结束
              */ 
            //5.按照100KB 写出“视频.mp4”文件
            desc.write(data,0,len);
           }

    }
}